package doc2db.interfaces.action.open;

import java.io.File;
import java.util.LinkedList;
import java.util.List;
import javax.swing.JEditorPane;

/**
 *
 * @author yura
 */
public abstract class MEditHtmlCreator extends JEditorPane implements CSS{

    /** Показывать не видемые файлы */
    protected boolean showInvisibleFile = true;

    /** вернутся на один каталог выше */
    public static final int BACK = Integer.MAX_VALUE / 2;

    /** вернутся на один каталог выше */
    public static final int PROC = Integer.MAX_VALUE / 3 * 2;
    /**
     * Создаёт текст с html файла с списком файлов в каталоге
     * @param file файл
     * @return html текст
     */
    public String createDirFile(File file){
        StringBuffer sb = new StringBuffer(head)
                .append("<br>file: ")
                .append(file.getAbsolutePath())
                .append("<br> <table width=100%><tr><td align=left>\n")
                .append(getA(BACK, "назад"))
                .append("</td>\n<td align=right>")
                .append(getA(PROC, "class=" + classButton, "обработать"))
                .append("</td></tr><table>\n")
                .append("<br>\n");
        if (file.isDirectory()) {
            File arr[] = file.listFiles();

            if (arr != null) {
                sb.append(createList(arr, openOL, closeOL))
                        .append("<br>all files: ").append(arr.length);
            } else {
                sb.append("cab get data from: ").append(file.getAbsolutePath());
            }
        }else {

        }
        sb.append("<table width=100%><tr><td align=left>\n")
                .append("</td>\n<td align=right>")
                .append(getA(PROC, "class=" + classButton, "обработать"))
                .append("</td></tr><table>\n")
                .append(end);
        return sb.toString();
    }



    /**
     * Генерирует код html для создания
     * @param arr
     * @return
     */
    protected String createTable (String [] arr) {
        StringBuilder sb = new StringBuilder(openTable);
        for (int i = 0; i < arr.length; i++) {
            if (!showInvisibleFile) {
                if (arr[i].startsWith(".")) {
                    sb.append(openTR)
                            .append(openTD)
                            .append(getA(i, arr[i]))
                            .append(closeTD)
                            .append(closeTR)
                            .append("\n");
                }
            }else {
                sb.append(openTR)
                        .append(openTD)
                        .append(getA(i, arr[i]))
                        .append(closeTD)
                        .append(closeTR)
                        .append("\n");
            }
        }
        sb.append(closeTable);
        return sb.toString();
    }

    /**
     * Генерирует код html для создания списка
     * @param arr входной масив
     * @param lo тег открытия списка <i>(например < ol >)</i>
     * @param lc тег закрытия списка <i>(например < /ol >)</i>
     * @return код html
     */
    protected String createList (String [] arr, String lo, String lc) {
        StringBuilder sb = new StringBuilder(lo);
        for (int i = 0; i < arr.length; i++) {
            if (!showInvisibleFile) {
                if (arr[i].startsWith(".")) {
                    sb.append(openLI)
                            .append(getA(i, arr[i]))
                            .append(closeLI)
                            .append("\n");
                }
            }else {
                sb.append(openLI)
                        .append(getA(i, arr[i]))
                        .append(closeLI)
                        .append("\n");
            }
        }
        sb.append(lc);
        return sb.toString();
    }

    /**
     * Генерирует код html для создания списка
     * @param arr входной масив
     * @param lo тег открытия списка <i>(например < ol >)</i>
     * @param lc тег закрытия списка <i>(например < /ol >)</i>
     * @return код html
     */
    protected String createList (File [] arr, String lo, String lc) {
        List<ListElement>[] list = new LinkedList[4];
        for (int i = 0; i < list.length; i++) 
            list[i] = new LinkedList<ListElement>();
        StringBuffer sb = new StringBuffer(openTable)
                .append("\n<TR><TH>Папки</TH><TH>Файлы</TH></TR>\n<TR valign=\"top\"><TD>\n")
                .append(openOL);

        for (int i = 0; i < arr.length; i++) {
            if (arr[i].isDirectory()){
                if (arr[i].getName().startsWith(".")){
                    list[1].add(new ListElement(arr[i], i));
                } else {
                    list[0].add(new ListElement(arr[i], i));
                }
            } else {
                if (arr[i].getName().endsWith(".doc")){
                    list[2].add(new ListElement(arr[i], i));
                } else {
                    list[3].add(new ListElement(arr[i], i));
                }
            }
        }


        if (! list[0].isEmpty()){
            for (ListElement f: list[0]) {
                sb.append(openLI)
                  .append(getA(f.pos, "class=\"" + classAllDir + "\"", f.file.getName()))
                  .append(closeLI).append("\n");
            }
        }
        if (! list[1].isEmpty()){
            for (ListElement f: list[1]) {
                sb.append(openLI)
                  .append(getA(f.pos, "class=\"" + classHideDir + "\"", f.file.getName()))
                  .append(closeLI).append("\n");
            }
        }
        sb.append(closeOL).append("\n</TD><TD>\n").append(openOL).append("\n");
        if (! list[2].isEmpty()){
            for (ListElement f: list[2]) {
                sb.append(openLI)
                  .append(getA(f.pos, "class=\"" + classDocFile + "\"", f.file.getName()))
                  .append(closeLI).append("\n");
            }
        }
        if (! list[3].isEmpty()){
            for (ListElement f: list[3]) {
                sb.append(openLI)
                  .append(getA(f.pos, "class=\"" + classAllFile + "\"", f.file.getName()))
                  .append(closeLI).append("\n");
            }
        }
        sb.append(closeOL).append("\n</TD></TR>\n");


        sb.append(closeTable);
        return sb.toString();
    }

    /**
     * Создаёт html-код гипер ссылки
     * &lt;A <b>prefix</b> href=<b>i</b>&gt; <b> s </b> &lt;/A&gt;
     * @param i адрес по ссылки
     * @param prefix дополнительные атрибуты
     * @param s наполнение тега
     * @return  код html
     */
    protected String getA (int i, String prefix, String s){
        return "<a " + prefix + " href=\"" + i + "\">" +
                s.replace("&", "&amp;").replace(">", "&gt;")
                 .replace("<", "&lt;").replace("\"", "&quot;")
                 .replace("'", "&apos;").replace("\n", " <br>")
                 .replaceAll("  ", "&nbsp;&nbsp;").replaceAll("\t", "<pre>&#09;<\\pre>")
                 .replaceAll("	", "<pre>&#09;<\\pre>") +
                 "</a>";
    }

    /**
     * Создаёт html-код гипер ссылки
     * &lt;A href=<b>i</b>&gt; <b> s </b> &lt;/A&gt;
     * @param i адрес по ссылки
     * @param s наполнение тега
     * @return  код html
     */
    protected String getA (int i, String s){
        return getA(i, "", s);
    }


    class ListElement{
        File file;
        int pos;
        ListElement(File file, int pos) {
            this.file = file;
            this.pos = pos;
        }
    }

}
